package fr.charlott.view;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import fr.charlott.business.dto.CategorieDTO;
import fr.charlott.business.dto.SaisonDTO;
import fr.charlott.business.service.CategorieService;
import fr.charlott.business.service.SaisonService;
import fr.charlott.core.repository.model.Collection;
import fr.charlott.core.repository.model.TailleBas;
import fr.charlott.core.repository.model.TailleHaut;
import fr.charlott.tools.exceptions.FunctionalException;
import fr.charlott.tools.exceptions.TechnicalException;

@Component("applicationControler")
@Scope("application")
public class ApplicationControler extends CharlottControler {

    private static final long serialVersionUID = 3581166600833584178L;

    private SaisonDTO saisonCourante;

    private List<TailleHaut> taillesHaut = new ArrayList<TailleHaut>();

    private List<TailleBas> taillesBas = new ArrayList<TailleBas>();

    private List<Collection> collections = new ArrayList<Collection>();

    private List<CategorieDTO> categories = new ArrayList<CategorieDTO>();

    private List<SaisonDTO> saisons = new ArrayList<SaisonDTO>();

    @Value("${init.saison.courante}")
    private String anneeSaisonCourante;

    @Autowired(required = true)
    public ApplicationControler(SaisonService saisonService, CategorieService categorieService) throws TechnicalException, FunctionalException {

        // Initialisation de la saison courante
        if (StringUtils.isEmpty(anneeSaisonCourante)) {
            anneeSaisonCourante = "2013";
        }
        SaisonDTO saison = new SaisonDTO(Short.valueOf(anneeSaisonCourante));
        saison.setSaisonCourante(true);
        try {
            saisonService.ajouterSaison(saison);
        } catch (TechnicalException e) {
            e.printStackTrace();
        }
        this.saisonCourante = saisonService.chargerSaisonCourante();

        // Initialisation des tailles
        TailleHaut[] tailleHautValues = TailleHaut.values();
        for (TailleHaut tailleHaut : tailleHautValues) {
            taillesHaut.add(tailleHaut);
        }

        TailleBas[] tailleBasValues = TailleBas.values();
        for (TailleBas tailleBas : tailleBasValues) {
            taillesBas.add(tailleBas);
        }

        // Initialisation des collections
        Collection[] collectionValues = Collection.values();
        for (Collection collection : collectionValues) {
            collections.add(collection);
        }

        // Initialisation des categories
        this.categories = categorieService.chargerToutesLesCategories();

        // Initialisation des saisons
        this.saisons = saisonService.chargerTousLesSaisons();
    }

    // Getters and setters
    public List<TailleHaut> getTaillesHaut() {
        return taillesHaut;
    }

    public List<TailleBas> getTaillesBas() {
        return taillesBas;
    }

    public List<Collection> getCollections() {
        return collections;
    }

    public List<CategorieDTO> getCategories() {
        return categories;
    }

    public SaisonDTO getSaisonCourante() {
        return saisonCourante;
    }

    public List<SaisonDTO> getSaisons() {
        return saisons;
    }
}
